var credentials = require('./credentials.json');
var payloadTypes = require('./payloadTypes.json');
var OAModel = require('./OAModel.json');
var fs = require('fs');
PROTO_HEARTBEAT_EVENT_PAYLOADTYPE = 51;
uid = (
(i) => () =>
'cm_id_' + i++
)(1);
var { accountId: ctidTraderAccountId, accessToken } = credentials;
var ws = new WebSocket('wss://live.ctraderapi.com:5036');
function main() {
console.log('ready to do something');
var clientMsg = {
clientMsgId: uid(),
payloadType: payloadTypes.PROTO_OA_SYMBOLS_LIST_REQ,
payload: {
ctidTraderAccountId,
accessToken,
includeArchivedSymbols: false,
},
};
ws.send(JSON.stringify(clientMsg));
var clientMsg = {
clientMsgId: uid(),
payloadType: payloadTypes.PROTO_OA_NEW_ORDER_REQ,
payload: {
ctidTraderAccountId,
accessToken,
orderType: OAModel.ProtoOAOrderType.LIMIT,
tradeSide: OAModel.ProtoOATradeSide.BUY,
symbolId: 41,
limitPrice: 2700.34,
volume: 100,
stopLoss: 2600.34,
takeProfit: 2750.34,
},
};
ws.send(JSON.stringify(clientMsg));
}
function onResp(message) {
var { payloadType, payload } = message;
if (payloadType === payloadTypes.PROTO_OA_SYMBOLS_LIST_RES) {
var syms = payload.symbol;
fs.writeFileSync('syms.json', JSON.stringify(syms, null, 2));
console.log('got the symbol list and saved it as syms.json');
}
if (payloadType === payloadTypes.PROTO_OA_EXECUTION_EVENT) {
console.log('placed order successfully');
console.log('order id:', payload.order.orderId);
}
}
ws.onopen = function (e) {
console.log('connected');
var clientMsg = {
clientMsgId: uid(),
payloadType: payloadTypes.PROTO_OA_APPLICATION_AUTH_REQ,
payload: {
clientId: credentials.clientId,
clientSecret: credentials.clientSecret,
},
};
ws.send(JSON.stringify(clientMsg));
};
ws.onmessage = function (e) {
var serverMsg = JSON.parse(e.data);
var { payloadType } = serverMsg;
if (payloadType === payloadTypes.PROTO_OA_APPLICATION_AUTH_RES) {
console.log('app auth done');
var clientMsg = {
clientMsgId: uid(),
payloadType: payloadTypes.PROTO_OA_ACCOUNT_AUTH_REQ,
payload: { ctidTraderAccountId, accessToken },
};
ws.send(JSON.stringify(clientMsg));
return;
}
if (payloadType === payloadTypes.PROTO_OA_ACCOUNT_AUTH_RES) {
console.log('account auth done');
main();
return;
}
if (payloadType === payloadTypes.PROTO_OA_ERROR_RES) {
console.log('server sent error message', serverMsg.payload);
return;
}
if (payloadType === PROTO_HEARTBEAT_EVENT_PAYLOADTYPE) {
console.log('heartbeat event');
return;
}
onResp(serverMsg);
};
ws.onerror = function (e) {
console.log('websocket error', e);
};
ws.onclose = function (e) {
console.log('disconnected', e.code, e.reason, e.wasClean);
};